﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Follow.Common;
using Follow.Model;
using Follow.DataAccess;
using System.Transactions;

namespace Follow.Business
{
    public class GrupoBO
    {
        public IList<Grupo> findByDescricao(string descricao)
        {
            GrupoDAO dao = new GrupoDAO();
            return dao.findAll(descricao);
        }

        public Int32 findIdClientes()
        {
            GrupoDAO dao = new GrupoDAO();
            return dao.findIdClientes();
        }

        public IList<Grupo> save(Grupo grupo, Int32 idUsuario)
        {
            GrupoDAO dao = new GrupoDAO();
            IList<Grupo> Grupos = new List<Grupo>();

            if (grupo.IDGrupo == Int32.MinValue || grupo.IDGrupo.Equals(0))
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    try
                    {
                        Grupos = dao.insert(grupo, idUsuario);
                        scope.Complete();
                    }
                    catch
                    {
                        scope.Dispose();
                        throw;
                    }
                }

            }
            else
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    try
                    {
                        Grupos = dao.update(grupo, idUsuario);
                       
                        scope.Complete();
                    }
                    catch
                    {
                        scope.Dispose();
                        throw;
                    }
                }
            }

            return Grupos;
        }

        private void validate(Grupo grupo)
        {
            ValidationExceptions exceptions = new ValidationExceptions();

            if (String.IsNullOrEmpty(grupo.Descricao))
            {
                exceptions.AddExceptionItem("O campo descrição está incompleto.");
            }

            exceptions.ThrowPendingExceptions();
        }


        public Grupo load(Int32 id)
        {
            GrupoDAO dao = new GrupoDAO();
            return dao.findByID(id);
        }
        public void delete(Int32 id, Int32 idUsuario)
        {
            GrupoDAO dao = new GrupoDAO();
            validarExclusao(id);
            dao.delete(id, idUsuario);
        }

        private void validarExclusao(Int32 id)
        {
            UsuarioDAO usuarioDAO = new UsuarioDAO();
            IList<Usuario> usuario = usuarioDAO.findByGrupo(id);

            if (usuario != null && !(usuario.Count.Equals(0)))
            {
                throw new Exception("Esse Grupo não pode ser excluído pois existem usuários associados a ele.");
            }
        }
    }
}